package cn.tedu.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置类声明rabbitmq组件
 */
//@Configuration
public class DeclareConfig {
    /**
     * 生命的所有组件及绑定关系，在当前整合架构中都是容器bean对象
     * demo-queue Queue的容器bean对象
     * demo-ex direct-ex的容器bean对象
     * demo-queue使用demo-rk绑定demo-ex路由交换机 Binding的容器bean对象
     */

    // 声明queue对象
    @Bean
    public Queue demoQueue() {
        // channel.queueDeclare(queue, durable, exclusive, autoDelete, arguments) 队列名称，是否持久化，是否独占，是否自动删除，参数
        // 第一种方式，直接new一个对象
//        return new Queue("demo-queue",true,false,false);
        // 第二种方式，框架提供的builder构建器——QueueBuilder，类似的还有ExchangeBuilder、BindingBuilder
        return QueueBuilder.nonDurable("demo-queue").build();
    }

    // 声明交换机
    @Bean
    public Exchange demoDirect() {
        // channel.exchangeDeclare(exchange, type, durable, autoDelete, arguments) 交换机名称，交换机类型，是否持久化，是否自动删除，参数
        // 第一种方式，直接new一个对象
        // 第二种方式，框架提供的builder构建器——ExchangeBuilder
        return ExchangeBuilder.directExchange("demo-ex").durable(true).build();
    }

    // 声明绑定关系
    @Bean
    public Binding demoBinding() {
        // channel.queueBind(queue, exchange, routingKey, arguments) 队列名称，交换机名称，路由键，参数
        // 第一种方式，直接new一个对象
        // 第二种方式，框架提供的builder构建器——BindingBuilder
        return BindingBuilder.bind(demoQueue()).to(demoDirect())
                .with("demo-rk").noargs();
    }
}
